/**
 * 
 */
package team3;

import java.util.Stack;

/**
 * @author dzsebedi
 * 
 */
public class Scanner {

	public static final int ZUSTAND0 = 0;
	public static final int ZUSTAND1 = 1;
	public static final int ZUSTAND2 = 2;
	public static final int ZUSTAND3 = 3;
	public static final int ZUSTAND4 = 4;
	public static final int ZUSTAND5 = 5;
	public static final int ZUSTAND6 = 6;
	public static final int ZUSTAND7 = 7;

	private char[] eingabemenge = { '0', '1', '2', '3', '4', '5', '6', '7',
			'8', '9', '+', '-', '*', '/', '^', '(', ';', ')', '.' };

	private String ausdruck = "4";
	
	private String buffer = "";
	private int zustand = Scanner.ZUSTAND0;
	
	private Stack<Tripel> tripel = new Stack<Tripel>();
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner = new Scanner();
		scanner.scanneAusdruck(scanner.getAusdruck());
	}

	public Stack<Tripel> scanneAusdruck(String ausdruck) {


		for (int i = 0; i < ausdruck.length(); i++) {

			char zeichen = ausdruck.charAt(i);
			zustand = scan(zustand, zeichen);
			if (zustand == Scanner.ZUSTAND1 || zustand == Scanner.ZUSTAND2 || zustand == Scanner.ZUSTAND3) {
				buffer += zeichen;
			}
			if (zustand == Scanner.ZUSTAND0 && !buffer.isEmpty()) {
				i--;
				buffer = "";
			}

		}
		
		return tripel;

	}

	private int scan(int zustand, char zeichen) {

		int lokZustand = zustand;

		if (lokZustand == 0) {

			if (zeichen == '0' || zeichen == '1' || zeichen == '2'
					|| zeichen == '3' || zeichen == '4' || zeichen == '5'
					|| zeichen == '6' || zeichen == '7' || zeichen == '8'
					|| zeichen == '9') {
				lokZustand = Scanner.ZUSTAND1;
			}

			if (zeichen == '+' || zeichen == '-' || zeichen == '*'
					|| zeichen == '/' || zeichen == '(' || zeichen == ')'
					|| zeichen == '^') {
				lokZustand = Scanner.ZUSTAND4;
			}

			else if (zeichen == '.') {
				lokZustand = Scanner.ZUSTAND5;
			}

			else if (zeichen == Token.ENDE.getCode()) {
				lokZustand = Scanner.ZUSTAND6;
			}

			else if (!gueltigeEingabe(zeichen)) {
				lokZustand = Scanner.ZUSTAND7;
			}
		}

		switch (lokZustand) {

		case Scanner.ZUSTAND1:
			
			if (zeichen == '.') {
				lokZustand = Scanner.ZUSTAND2;
			}

			else if (zeichen == '0' || zeichen == '1' || zeichen == '2'
					|| zeichen == '3' || zeichen == '4' || zeichen == '5'
					|| zeichen == '6' || zeichen == '7' || zeichen == '8'
					|| zeichen == '9') {
				
				
			}
			
			else {
				ausgeben("ZAHL", buffer, 0);
				lokZustand = Scanner.ZUSTAND0;
			}

			break;

		case Scanner.ZUSTAND2:
			
			if (zeichen == '0' || zeichen == '1' || zeichen == '2'
					|| zeichen == '3' || zeichen == '4' || zeichen == '5'
					|| zeichen == '6' || zeichen == '7' || zeichen == '8'
					|| zeichen == '9') {
				lokZustand = Scanner.ZUSTAND3;
			}
			else {
				ausgeben("Falsche Konstante", buffer, 1);
				lokZustand = Scanner.ZUSTAND0;
			}

			break;

		case Scanner.ZUSTAND3:
			
			
			if (zeichen == '0' || zeichen == '1' || zeichen == '2'
				|| zeichen == '3' || zeichen == '4' || zeichen == '5'
				|| zeichen == '6' || zeichen == '7' || zeichen == '8'
				|| zeichen == '9') {
				
			}
			
			else {
				ausgeben("ZAHL", buffer, 0);
				lokZustand = Scanner.ZUSTAND0;
			}

			break;

		case Scanner.ZUSTAND4:

			String code = "";

			for (int i = 0; i < Token.values().length; i++) {
				if (Token.values()[i].getCode() == zeichen) {
					code = Token.values()[i].toString();
					break;
				}
			}

			ausgeben(code, "" + zeichen, 0);
			lokZustand = Scanner.ZUSTAND0;

			break;

		case Scanner.ZUSTAND5:

			ausgeben("Falsche Konstante", "" + zeichen, 2);
			lokZustand = Scanner.ZUSTAND0;

			break;

		case Scanner.ZUSTAND6:

			ausgeben("ENDE", "" + zeichen, 0);
			lokZustand = Scanner.ZUSTAND0;

			break;

		case Scanner.ZUSTAND7:

			ausgeben("Ungueltiges Zeichen", "" + zeichen, 1);
			lokZustand = Scanner.ZUSTAND0;

			break;
		}

		return lokZustand;

	}

	private void ausgeben(String token, String lexem, int fehlercode) {
		System.out.println("Tripel: (" + token + ", " + lexem + ", "
				+ fehlercode + ")");
		tripel.add(0, new Tripel(token, lexem, fehlercode));
		
	}

	private boolean gueltigeEingabe(char zeichen) {

		for (int i = 0; i < eingabemenge.length; i++) {
			if (zeichen == eingabemenge[i]) {
				return true;
			}
		}
		return false;
	}
	
	public Tripel naechstesZeichen() {
		if (!tripel.isEmpty())
			return tripel.pop();
		else
			return null;
	}

	/**
	 * @return the ausdruck
	 */
	public String getAusdruck() {
		return ausdruck;
	}

}
